home *** CD-ROM | disk | FTP | other *** search
- /*--------------------------------------------------------------------------*/
- /* */
- /* */
- /* ------------ Bit-Bucket Software <no-Inc> */
- /* \ 10001101 / Writers and Distributors of */
- /* \ 011110 / No-Cost<no-tm> Software. */
- /* \ 1011 / */
- /* ------ */
- /* */
- /* Copyright (C) 1987, 1988, 1989 by Robert Hartman and Vincent Perriello */
- /* */
- /* */
- /* This module was written by Bob Hartman */
- /* */
- /* */
- /* BinkleyTerm Scheduler Routines */
- /* */
- /* */
- /* For complete details of the licensing restrictions, please refer */
- /* to the License agreement, which is published in its entirety in */
- /* the MAKEFILE and BT.C, and also contained in the file LICENSE.210. */
- /* */
- /* USE OF THIS FILE IS SUBJECT TO THE RESTRICTIONS CONTAINED IN THE */
- /* BINKLEYTERM LICENSING AGREEMENT. IF YOU DO NOT FIND THE TEXT OF */
- /* THIS AGREEMENT IN ANY OF THE AFOREMENTIONED FILES, OR IF YOU DO */
- /* NOT HAVE THESE FILES, YOU SHOULD IMMEDIATELY CONTACT THE AUTHORS */
- /* AT THE ADDRESSES LISTED BELOW. IN NO EVENT SHOULD YOU PROCEED TO */
- /* USE THIS FILE WITHOUT HAVING ACCEPTED THE TERMS OF THE */
- /* BINKLEYTERM LICENSING AGREEMENT, OR SUCH OTHER AGREEMENT AS YOU */
- /* ARE ABLE TO REACH WITH THE AUTHORS. */
- /* */
- /* */
- /* The Authors can be reached at the following addresses: */
- /* */
- /* Robert C. Hartman Vincent E. Perriello */
- /* Spark Software VEP Software */
- /* 427-3 Amherst Street 111 Carroll Street */
- /* CS2032, Suite 232 Naugatuck, CT 06770 */
- /* Nashua, NH 03061 */
- /* */
- /* FidoNet 1:132/101 FidoNet 1:141/491 */
- /* Data (603) 888-8179 Data (203) 729-7569 */
- /* */
- /* Please feel free to contact us at any time to share your comments */
- /* about our software and/or licensing policies. */
- /* */
- /*--------------------------------------------------------------------------*/
-
- #include <stdio.h>
- #include <ctype.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <string.h>
- #include <stdlib.h>
- #include <process.h>
- #include <time.h>
-
- #ifdef __TURBOC__
- #include "tc_utime.h"
- #include <alloc.h>
- #include <mem.h>
- #else
- #include <sys/utime.h>
- #include <malloc.h>
- #include <memory.h>
- #endif
-
- #include "com.h"
- #include "xfer.h"
- #include "zmodem.h"
- #include "keybd.h"
- #include "sbuf.h"
- #include "sched.h"
- #include "externs.h"
- #include "prototyp.h"
-
- static char *start_time (EVENT *, char *);
- static char *end_time (EVENT *, char *);
- static void write_stats (void);
-
-
- /**************************************************************************/
- /*** This MUST be exactly 16 total bytes including the terminating null ***/
- /*** or the routines read_sched() and write_sched() must be changed!!!! ***/
- /**************************************************************************/
- static char *BinkSched = "BinkSchedule 02"; /* Version of scheduler */
-
- static char *start_time (e, p)
- EVENT *e;
- char *p;
- {
- int i, j, k, l, n;
-
- if ((n = sscanf (p, "%d:%d,%d,%d", &i, &j, &k, &l)) < 2)
- {
- return NULL;
- }
-
- e->minute = i * 60 + j;
- if ((e->minute < 0) || (e->minute > (24 * 60)))
- {
- return (NULL);
- }
-
- if (n >= 3)
- e->month = (char)k;
- if (n >= 4)
- e->day = (char)l;
-
- p = skip_to_blank (p);
-
- return (p);
- }
-
- static char *end_time (e, p)
- EVENT *e;
- char *p;
- {
- int i, j, k;
-
- if (sscanf (p, "%d:%d", &i, &j) != 2)
- {
- return NULL;
- }
-
- k = i * 60 + j;
- if ((k > (24 * 60)) || (k < 0))
- {
- return (NULL);
- }
-
- if (k < e->minute)
- {
- printf ("Ending time wraps through midnight - not allowed\n");
- return (NULL);
- }
-
- e->length = k - e->minute;
-
- p = skip_to_blank (p);
-
- return (p);
- }
-
- int parse_event (e_line)
- char *e_line;
- {
- int i, j, j1, j2;
- char *p, *p1;
- EVENT *e;
-
- /* If we already have a schedule, then forget it */
- if (got_sched)
- return (0);
-
- /* Skip blanks to get to the days field */
- p = skip_blanks (e_line);
-
- /* Parse the days field */
- e = (EVENT *) calloc (sizeof (EVENT), 1);
- e->days = 0;
- e->wait_time = 120;
- while ((*p) && (!isspace (*p)))
- {
- switch (toupper (*p))
- {
- case 'S': /* Sunday or Saturday */
- if (!strnicmp (p, "sun", 3))
- {
- e->days |= DAY_SUNDAY;
- }
- else if (!strnicmp (p, "sat", 3))
- {
- e->days |= DAY_SATURDAY;
- }
- else /* Error condition */
- {
- goto err;
- }
- p += 3;
- break;
-
- case 'M': /* Monday */
- if (!strnicmp (p, "mon", 3))
- {
- e->days |= DAY_MONDAY;
- }
- else /* Error condition */
- {
- goto err;
- }
- p += 3;
- break;
-
- case 'T': /* Tuesday or Thursday */
- if (!strnicmp (p, "tue", 3))
- {
- e->days |= DAY_TUESDAY;
- }
- else if (!strnicmp (p, "thu", 3))
- {
- e->days |= DAY_THURSDAY;
- }
- else /* Error condition */
- {
- goto err;
- }
- p += 3;
- break;
-
- case 'W': /* Wednesday, Week or
- * Weekend */
- if (!strnicmp (p, "wed", 3))
- {
- e->days |= DAY_WEDNESDAY;
- p += 3;
- }
- else if (!strnicmp (p, "week", 4))
- {
- e->days |= DAY_WEEK;
- p += 4;
- }
- else if (!strnicmp (p, "wkend", 5))
- {
- e->days |= DAY_WKEND;
- p += 5;
- }
- else /* Error condition */
- {
- goto err;
- }
- break;
-
- case 'F': /* Friday */
- if (!strnicmp (p, "fri", 3))
- {
- e->days |= DAY_FRIDAY;
- }
- else /* Error condition */
- {
- goto err;
- }
- p += 3;
- break;
-
- case 'A': /* All */
- if (!strnicmp (p, "all", 3))
- {
- e->days |= (DAY_WEEK | DAY_WKEND);
- }
- else /* Error condition */
- {
- goto err;
- }
- p += 3;
- break;
-
- default: /* Error condition */
- goto err;
- }
-
- if (*p == '|')
- ++p;
- }
-
- /* Did we get something valid? */
- if (e->days == 0)
- {
- goto err;
- }
-
- /* Skip blanks to get to the start-time field */
- p = skip_blanks (p);
-
- /* Parse the start-time field */
- if ((p = start_time (e, p)) == NULL)
- {
- printf ("'%s' has an invalid START-TIME\n", e_line);
- free (e);
- return (1);
- }
-
- /* Give each event a default of 60 minutes */
- e->length = 60;
-
- /* Give each event a local cost of 0 */
- e->node_cost = 0;
-
- /* Give each event a default of T=3,10000 */
- e->with_connect = 3;
- e->no_connect = 10000;
-
- /* While there are still things on the line */
- while (*p)
- {
- /* Skip blanks to get to the next field */
- p = skip_blanks (p);
-
- /* switch to find what thing is being parsed */
- switch (tolower (*p))
- {
- case '\0': /* No more stuff */
- break;
-
- case '0': /* Digits must be an ending
- * time */
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- /* Parse ending time */
- if ((p = end_time (e, p)) == NULL)
- {
- printf ("'%s' has an invalid END-TIME\n", e_line);
- free (e);
- return (1);
- }
- break;
-
- case ';': /* Comment */
- case '%':
- *p = '\0';
- break;
-
- case '"': /* Extra chars to append to
- * packer strings */
- ++p;
- p1 = e->cmd;
- *p1++ = ' ';
- while (*p != '"')
- *p1++ = *p++;
- *p1 = '\0';
- ++p;
- break;
-
- case 'a': /* Average wait */
- ++p;
- if (*p == '=')
- {
- ++p;
- if (isdigit (*p))
- {
- i = atoi (p);
- if ((i > 1800) || (i < 0))
- {
- printf ("'%s' has bad AvgWait (higher than max of 1800 or less than min of 0)\n", e_line);
- free (e);
- return (1);
- }
- e->wait_time = i;
- p = skip_to_blank (p);
- break;
- }
- }
- printf ("'%s' has a bad AvgWait code\n", e_line);
- free (e);
- return (1);
-
- case 'b': /* BBS type event */
- p = skip_to_blank (p);
- e->behavior |= MAT_BBS;
- break;
-
- case 'c': /* #CM event */
- p = skip_to_blank (p);
- e->behavior |= MAT_CM;
- break;
-
- case 'd': /* Dynamic event */
- p = skip_to_blank (p);
- e->behavior |= MAT_DYNAM;
- break;
-
- case 'e': /* An errorlevel exit */
- ++p;
- if (isdigit (*p))
- {
- i = *p - '0';
- ++p;
- if ((*p == '=') && (i <= 5) && (i > 0))
- {
- ++p;
- if (isdigit (*p))
- {
- j = atoi (p);
- e->errlevel[i - 1] = j;
- p = skip_to_blank (p);
- break;
- }
- }
- }
- printf ("'%s' has a bad Errorlevel code\n", e_line);
- free (e);
- return (1);
-
- case 'f': /* Forced event */
- p = skip_to_blank (p);
- e->behavior |= MAT_FORCED;
- break;
-
- case 'k': /* no #CM event */
- p = skip_to_blank (p);
- e->behavior |= MAT_NOCM;
- break;
-
- case 'l': /* Local only mail */
- ++p;
- e->node_cost = 0;
- if (*p == '=')
- {
- ++p;
- if (isdigit (*p))
- {
- e->node_cost = atoi (p);
- }
- }
- else if (*p == '>')
- {
- ++p;
- if (isdigit (*p))
- {
- e->node_cost = -atoi (p) - 1;
- }
- }
- else if (*p == '<')
- {
- ++p;
- if (isdigit (*p))
- {
- e->node_cost = atoi (p) - 1;
- }
- }
- p = skip_to_blank (p);
- e->behavior |= MAT_LOCAL;
- break;
-
- case 'm': /* Mailable 24 hours */
- p = skip_to_blank (p);
- e->behavior |= MAT_NOMAIL24;
- break;
-
- case 'n': /* No requests */
- p = skip_to_blank (p);
- e->behavior |= MAT_NOREQ;
- break;
-
- case 'r': /* Receive only */
- p = skip_to_blank (p);
- e->behavior |= MAT_NOOUT;
- break;
-
- case 's': /* Send only */
- p = skip_to_blank (p);
- e->behavior |= MAT_OUTONLY;
- break;
-
- case 't': /* Tries */
- ++p;
- if (sscanf (p, "=%d,%d", &j1, &j2) != 2)
- {
- printf ("'%s' has a bad number of Tries\n", e_line);
- return (1);
- }
- else
- {
- if ((j1 > 8) || (j1 < 1))
- {
- printf ("'%s' has a bad number of Tries\n", e_line);
- return (1);
- }
- e->with_connect = j1;
- e->no_connect = j2;
- }
- p = skip_to_blank (p);
- break;
-
- case 'x': /* No outbound requests here */
- p = skip_to_blank (p);
- e->behavior |= MAT_NOOUTREQ;
- break;
-
- default: /* Error condition */
- printf ("'%s' has something indecipherable\n", e_line);
- free (e);
- return (1);
- }
- }
-
- /* Save it in the array of pointers */
- e_ptrs[num_events++] = e;
-
- /* Return that everything is cool */
- return (0);
-
- err:
- printf ("'%s' has an invalid DAY field\n", e_line);
- free (e);
- return (1);
- }
-